package threads;

public abstract class Person implements Runnable{
  private String name;
  protected int tage;

  public Person(String n, int t){
    name=n;
    tage=t;
  }

  public boolean lebt(){return tage>0;}

  /**Definiert die Tätigkeiten einer Person während eines Tages.
   * Da diese individuell verschieden sind, muss dies von Fall zu Fall
   * gesondert implementiert werden.
   */
  public abstract void tagewerk();

  /**Warte eine Weile. Möchte man, dass eine Methode merklich lang braucht,
   * kann man entweder etwas Anspruchsvolles effizient tun, oder etwas Einfaches
   * ineffizient, oder man ruft diese Methode auf und wartet bloß.
   * @param wastun die durchzuführende Tätigkeit.
   * @param millis die zu wartende Zeit in Millisekunden, falls positiv. Ist
   *   der Wert negativ, warte eine zufällige Zeit, die höchstens so lang ist,
   *   wie der Betrag dieses Wertes.
   */
  public void dasdauert(String wastun, int millis){
    if(millis<0) millis=(int)(-Math.random()*millis);//übrigens thread-safe
    System.out.println(this+" braucht "+(millis/1000.)+" Sekunden für "+wastun+".");
    try{
      Thread.sleep(millis);
      System.out.println(this+" ist fertig mit "+wastun+".");
    }
    catch (InterruptedException ex) {
      System.out.println(this+" wurde beim "+wastun+" unterbrochen.");
    }
  }

  @Override
  public String toString(){return name;}

  @Override
  public void run(){
    while(this.lebt()) tagewerk();
  }
}